From 0ac10f37906756f1e3a96c983787015534dd18f4 Mon Sep 17 00:00:00 2001 From: aude Date: Thu, 28 Apr 2016 17:22:12 -0400 Subject: [PATCH] Add populateInterwiki maintenance script This has been in Wikibase since 2012, but is not at all specific to Wikibase, and doesn't even require Wikibase to be enabled. Having this in core will make it available to more people and without the hassle of having to clone Wikibase to use the script. Bug: T114577 Change-Id: Ib521a65e616bdc4b81206a084289cb4750f0d1f5 --- autoload.php | 1 + maintenance/populateInterwiki.php | 171 ++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 maintenance/populateInterwiki.php diff --git a/autoload.php b/autoload.php index 0283d3c512..0d127b7757 100644 --- a/autoload.php +++ b/autoload.php @@ -1083,6 +1083,7 @@ $wgAutoloadLocalClasses = [ 'PopulateContentModel' => __DIR__ . '/maintenance/populateContentModel.php', 'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php', 'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php', + 'PopulateInterwiki' => __DIR__ . '/maintenance/populateInterwiki.php', 'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php', 'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php', 'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php', diff --git a/maintenance/populateInterwiki.php b/maintenance/populateInterwiki.php new file mode 100644 index 0000000000..5d32b998bd --- /dev/null +++ b/maintenance/populateInterwiki.php @@ -0,0 +1,171 @@ + + */ + +require_once __DIR__ . '/Maintenance.php'; + +class PopulateInterwiki extends Maintenance { + + /** + * @var string + */ + private $source; + + /** + * @var BagOStuff + */ + private $cache; + + public function __construct() { + parent::__construct(); + + $this->addDescription( <<addOption( 'source', 'Source wiki for interwiki table, such as ' + . 'https://en.wikipedia.org/w/api.php (the default)', false, true ); + $this->addOption( 'force', 'Run regardless of whether the database says it has ' + . 'been run already.' ); + } + + public function execute() { + $force = $this->getOption( 'force', false ); + $this->source = $this->getOption( 'source', 'https://en.wikipedia.org/w/api.php' ); + + $this->cache = wfGetMainCache(); + + $data = $this->fetchLinks(); + + if ( $data === false ) { + $this->error( "Error during fetching data." ); + } else { + $this->doPopulate( $data, $force ); + } + } + + /** + * @return array[]|bool The 'interwikimap' sub-array or false on failure. + */ + protected function fetchLinks() { + $url = wfArrayToCgi( [ + 'action' => 'query', + 'meta' => 'siteinfo', + 'siprop' => 'interwikimap', + 'sifilteriw' => 'local', + 'format' => 'json' + ] ); + + if ( !empty( $this->source ) ) { + $url = rtrim( $this->source, '?' ) . '?' . $url; + } + + $json = Http::get( $url ); + $data = json_decode( $json, true ); + + if ( is_array( $data ) ) { + return $data['query']['interwikimap']; + } else { + return false; + } + } + + /** + * @param array[] $data + * @param bool $force + * + * @return bool + */ + protected function doPopulate( array $data, $force ) { + $dbw = wfGetDB( DB_MASTER ); + + if ( !$force ) { + $row = $dbw->selectRow( + 'updatelog', + '1', + [ 'ul_key' => 'populate interwiki' ], + __METHOD__ + ); + + if ( $row ) { + $this->output( "Interwiki table already populated. Use php " . + "maintenance/populateInterwiki.php\n--force from the command line " . + "to override.\n" ); + return true; + } + } + + foreach ( $data as $d ) { + $prefix = $d['prefix']; + + $row = $dbw->selectRow( + 'interwiki', + '1', + [ 'iw_prefix' => $prefix ], + __METHOD__ + ); + + if ( ! $row ) { + $dbw->insert( + 'interwiki', + [ + 'iw_prefix' => $prefix, + 'iw_url' => $d['url'], + 'iw_local' => 1 + ], + __METHOD__, + 'IGNORE' + ); + } + + $this->clearCacheEntry( $prefix ); + } + + $this->output( "Interwiki links are populated.\n" ); + + return true; + } + + /** + * @param string $prefix + */ + private function clearCacheEntry( $prefix ) { + $key = wfMemcKey( 'interwiki', $prefix ); + $this->cache->delete( $key ); + } + +} + +$maintClass = PopulateInterwiki::class; +require_once RUN_MAINTENANCE_IF_MAIN; -- 2.20.1